package com.itheima.window;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LeetCode2841 {
    //给你一个整数数组 nums 和两个正整数 m 和 k 。
    //
    //请你返回 nums 中长度为 k 的 几乎唯一 子数组的 最大和 ，如果不存在几乎唯一子数组，请你返回 0 。
    //
    //如果 nums 的一个子数组有至少 m 个互不相同的元素，我们称它是 几乎唯一 子数组。
    //
    //子数组指的是一个数组中一段连续 非空 的元素序列。
    //重复思考是使用map来去重加计数

    //窗口大小为k，判断条件是map的Key的数量是否大于等于m，所求为满足条件的窗口中的所有数的和
    public long maxSum(List<Integer> nums, int m, int k) {
        long sumMax = Long.MIN_VALUE;
        long sum = 0;
        int count = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        //构不成窗口的情况
        if(nums.size() < k){
            return 0;
        }
        for (int i = 0; i < nums.size(); i++) {
            sum = sum + nums.get(i);
           count = mapAdd(map, nums.get(i),count);
           if(i < k - 1){
               continue;
           }
            if (count >= m){
                sumMax = Math.max(sumMax,sum);
            }
            sum = sum - nums.get(i - k + 1);
            count = mapDelete(map, nums.get(i - k + 1),count);
        }
        return sumMax;
    }

    private int mapAdd(HashMap<Integer, Integer> map, int key,int count){
        if(map.containsKey(key)){
            map.put(key, map.get(key) + 1);
        }else{
            map.put(key, 1);
            count++;
        }
        return count;
    }
    private int mapDelete(HashMap<Integer, Integer> map, int key,int count){
        if(map.containsKey(key)){
            map.put(key, map.get(key) - 1);
            if(map.get(key) == 0){
                map.remove(key);
                count--;
            }
        }
        return count;
    }
}
